﻿CMAKE_MINIMUM_REQUIRED(VERSION 3.10)
PROJECT(NFLieRenStatic)

AUX_SOURCE_DIRECTORY(. SRC)
ADD_EXECUTABLE(${PROJECT_NAME} ${SRC})

set(NFSHM_LIEREN_PLUGINS
		NFMMOCommonPlugin NFMMOLogicPlayerPlugin NFMMOProxyPlayerPlugin NFMMOCenterPlayerPlugin NFMMOCityPlayerPlugin NFMMOGamePlayerPlugin
		NFMMOOnlinePlayerPlugin NFMMOWorldPlayerPlugin
		NFMMOSnsPlayerPlugin NFMMOSnsCommonPlugin NFMMOGuildPlayerPlugin
		CACHE INTERNAL "NFShmXFrame LieRen插件列表（公共变量）"
)

set(NFSHM_LIEREN_BIN_COMMON_LIBS
		NFMMOSnsCommon NFMMOResStore NFMMOLogicCommon NFMMOLogicMessage NFGameCommon Behavior RecastNavigation
		CACHE INTERNAL "NFShmXFrame LieRen插件列表（公共变量）"
)

# ============================================================================
# 确保链接依赖关系：所有库必须在链接前编译完成
# ============================================================================
# 注意：依赖关系将通过 ensure_link_dependencies_from_target 自动建立
# 该函数会在 TARGET_LINK_LIBRARIES 之后自动从链接库列表中提取库名并建立依赖关系
# 因此这里不需要手动调用 ensure_link_dependencies

if (CMAKE_BUILD_TYPE STREQUAL "Release")
	# 定义项目库列表（直接使用 CMake 目标名，CMake 会自动处理依赖关系和路径）
	# 使用公共核心库列表、框架插件列表和服务器插件列表（定义在 cmake/Dependencies.cmake）
	set(PROJECT_LIBS
			${NFSHM_LIEREN_PLUGINS}
			${NFSHM_LIEREN_BIN_COMMON_LIBS}
			${NFSHM_SERVER_PLUGINS}
			${NFSHM_SERVER_COMMON_LIBS}
			${NFSHM_FRAME_PLUGINS}
			${NFSHM_CORE_LIBS})

	# 定义系统库和第三方库（不需要建立依赖关系）
	# 使用公共系统库列表和第三方库列表（定义在 cmake/Dependencies.cmake）
	# NFLieRenStatic 需要额外的测试库和加密库
	set(SYSTEM_LIBS
			${NFSHM_SYSTEM_LIBS}
			${NFSHM_THIRD_PARTY_LIBS})
if(UNIX)
	# 直接链接所有库（使用目标名时，CMake 会自动建立依赖关系）
	TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${PROJECT_LIBS} ${SYSTEM_LIBS})
else(WIN32)
	# Windows Release 模式使用 /MT（静态链接运行时库），但某些第三方库（如 NFLuaBind.lib, event.lib）
	# 可能是用 /MD 编译的，它们需要 __imp_ 前缀的导入符号，这些符号由 msvcrt.lib 提供
	# 解决方案：先链接 msvcrt.lib（为第三方库提供导入符号），然后链接 libcmt.lib（主程序使用）
	# 排除默认库以避免自动链接冲突，但保留 msvcrt.lib 以便第三方库能找到导入符号
	set_target_properties(${PROJECT_NAME} PROPERTIES
		LINK_FLAGS "/NODEFAULTLIB:msvcrtd /NODEFAULTLIB:libcmtd"
	)
	# 直接链接所有库（使用目标名时，CMake 会自动建立依赖关系）
	TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${PROJECT_LIBS} ${SYSTEM_LIBS})
endif()

elseif(CMAKE_BUILD_TYPE STREQUAL "Debug")
	# 定义项目库列表（直接使用 CMake 目标名，CMake 会自动处理依赖关系和路径）
	# 使用公共核心库列表、框架插件列表和服务器插件列表（定义在 cmake/Dependencies.cmake）
	set(PROJECT_LIBS
			${NFSHM_LIEREN_PLUGINS}
			${NFSHM_LIEREN_BIN_COMMON_LIBS}
			${NFSHM_SERVER_PLUGINS}
			${NFSHM_SERVER_COMMON_LIBS}
			${NFSHM_FRAME_PLUGINS}
			${NFSHM_CORE_LIBS})

	# 定义系统库和第三方库（不需要建立依赖关系）
	# 使用公共系统库列表和第三方库列表（定义在 cmake/Dependencies.cmake）
	# NFLieRenStatic 需要额外的测试库和加密库
	set(SYSTEM_LIBS
			${NFSHM_SYSTEM_LIBS}
			${NFSHM_THIRD_PARTY_LIBS})
if(UNIX)
	# 直接链接所有库（使用目标名时，CMake 会自动建立依赖关系）
	TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${PROJECT_LIBS} ${SYSTEM_LIBS})
else(WIN32)
	# 直接链接所有库（使用目标名时，CMake 会自动建立依赖关系）
	TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${PROJECT_LIBS} ${SYSTEM_LIBS})
endif()
endif()

# 添加install规则
if (CMAKE_BUILD_TYPE STREQUAL "Release")
    install(TARGETS ${PROJECT_NAME}
            RUNTIME DESTINATION "Bin/Release")
elseif(CMAKE_BUILD_TYPE STREQUAL "Debug")
    install(TARGETS ${PROJECT_NAME}
            RUNTIME DESTINATION "Bin/Debug")
endif()



